home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / DCLAP 6d / dclap6d / DBio / DSeqAsmDoc.cpp < prev    next >
Text File  |  1996-07-05  |  20KB  |  821 lines

  1. // DSeqAsmDoc.cp
  2.  
  3. #define POPBASECALL
  4.  
  5. #include "DSeqAsmDoc.h"
  6.  
  7. #include <ncbi.h>
  8. #include <dgg.h>
  9. #include <Dvibrant.h>
  10. #include <DApplication.h>
  11. #include <DClipboard.h>
  12. #include <DControl.h>
  13. #include <DWindow.h>
  14. #include <DRichViewNu.h>
  15. #include <DTableView.h>
  16. #include <DViewCentral.h>
  17. #include <DTask.h>
  18. #include <DTracker.h>
  19. #include <DMenu.h>
  20. #include <DUtil.h>
  21. #include <DFindDlog.h>
  22. #include "DRichHandler.h"
  23. #include "DSeqFile.h"
  24. #include "DSeqEd.h"
  25. #include "DSeqMail.h"
  26. #include "DSeqCmds.h"
  27. #include "DSeqChildApp.h"
  28. #include "DSeqPrint.h"
  29. #include "DSeqPict.h"
  30. #include "DSeqViews.h"
  31.  
  32. #include "DSeqAsmView.h"
  33. #include "DAsmSequence.h"
  34.  
  35. #ifdef POPBASECALL
  36. #include "DBaseCallPop.h"
  37. #endif
  38.  
  39. static char gDefSeqNameStore[128];
  40. Boolean  DSeqAsmDoc::fgTestAutoseqFile = false; // turn on/off seq-test for OpenDocument()
  41.  
  42.  
  43. enum { kModeAsmPopup = 3310, kColorAsmPopup, kBaseOnTrace };
  44.  
  45.  
  46. class DAsmModePopup : public DPopupList
  47. {
  48. public:
  49.     DAsmModePopup(long id, DView* superior);
  50.     virtual short GetValue() { return DAlnView::kModeSlide + DPopupList::GetValue() - 1; }
  51. };
  52.  
  53. DAsmModePopup::DAsmModePopup(long id, DView* superior) :
  54.             DPopupList(id,superior,true)
  55. {
  56.     AddItem( "Slide bases");
  57.     AddItem( "Edit bases");
  58.     AddItem( "Bases + Traces");
  59.     AddItem( "A Bases + Trace");
  60.     AddItem( "C Bases + Trace");
  61.     AddItem( "G Bases + Trace");
  62.     AddItem( "T Bases + Trace");
  63.     this->SetValue(3);
  64. }
  65.  
  66.  
  67. class DAsmColorPopup : public DPopupList
  68. {
  69. public:
  70.     DAsmColorPopup(long id, DView* superior, short defaultvalue);
  71.     virtual short GetValue() { return DAlnView::kBaseBlack + DPopupList::GetValue() - 1; }
  72. };
  73.  
  74. DAsmColorPopup::DAsmColorPopup(long id, DView* superior, short defaultvalue) :
  75.             DPopupList(id,superior,true)
  76. {
  77.     AddItem( "Black");
  78.     AddItem( "Color");
  79.     this->SetValue(2); // (defaultvalue + 1 - DAlnView::kBaseBlack);
  80. }
  81.  
  82. // this dups in DSeqDoc
  83. class DSeqFormatPopup1 : public DPopupList
  84. {
  85. public:
  86.     DSeqFormatPopup1(long id, DView* superior, short defaultFormat);
  87.     virtual short GetValue() { return DSeqFile::kMinFormat + DPopupList::GetValue() - 1; }
  88. };
  89.  
  90. DSeqFormatPopup1::DSeqFormatPopup1(long id, DView* superior, short defaultFormat) :
  91.             DPopupList(id,superior,true)
  92. {
  93.     for (short i= DSeqFile::kMinFormat; i<=DSeqFile::kMaxFormat; i++) 
  94.         this->AddItem( (char*)DSeqFile::FormatName(i));
  95.     this->SetValue(defaultFormat);
  96. }
  97.  
  98.  
  99.  
  100. #ifdef notnowPOPBASECALL
  101.  
  102. enum { kBaseCallPopup = 4987 };
  103.  
  104. class DBaseCallPop1 : public DPopupList {
  105. public:
  106.     Boolean fVisible;
  107.     DAsmView* fAsmView;
  108.     
  109.     DBaseCallPop1(long id, DView* itsSuperior);
  110.     virtual short GetValue() { return /*basemode + */ DPopupList::GetValue() - 1; }
  111.     virtual Boolean IsMyAction(DTaskMaster* action);
  112. };
  113.  
  114. DBaseCallPop1* gBaseCallPop1 = NULL; // convert to field in fAsmDoc
  115.  
  116.  
  117. DBaseCallPop1::DBaseCallPop1(long id, DView* itsSuperior):
  118.         DPopupList(id, itsSuperior), 
  119.         fVisible(false), fAsmView(NULL) 
  120. {
  121.     //fAsmView= itsSuperior;
  122.     AddItem("clear bases");
  123.     AddItem("set A");
  124.     AddItem("set C");
  125.     AddItem("set G");
  126.     AddItem("set T");
  127.     // ?? stats display at position, other functions at trace position?
  128. }
  129.  
  130.  
  131. Boolean DBaseCallPop1::IsMyAction(DTaskMaster* action) 
  132. {
  133.     switch(action->Id()) {
  134.     
  135.      case kBaseCallPopup: {
  136.         Message(MSG_OK,"DBaseCallPop1::action not ready.");
  137.         short mode= this->GetValue();  
  138.         //fAsmView->SetViewMode( mode);
  139.         switch (mode) {
  140.             case 0: break;
  141.             case 1: break; // set a
  142.             case 2: break; // set c
  143.             case 3: break;
  144.             case 4: break;
  145.             }
  146.       return true;
  147.         }
  148.         
  149. #if 0
  150.         case DApplication::kFind:
  151.         case DApplication::kFindAgain:
  152.             return gApplication->DoMenuTask(action->Id(), NULL);
  153.         case DSeqDoc::cFindORF:
  154.             return fAlnView->fDoc->DoMenuTask( action->Id(), NULL);
  155. #endif
  156.         default:
  157.             return DPopupList::IsMyAction(action);
  158.         }
  159. }
  160.  
  161. #endif
  162.  
  163.  
  164.  
  165.  
  166.  
  167. //class DSeqAsmDoc
  168.  
  169.  
  170. DSeqAsmDoc::DSeqAsmDoc( long id, DSeqList* itsSeqList, char* name) :
  171.         DSeqDoc( id, itsSeqList, name),
  172.         fAsmSeq(NULL), fAutoseqFilesRead(0) , fNtrace(0), fHaveAsmseq(false)
  173. }
  174.  
  175. DSeqAsmDoc::~DSeqAsmDoc()
  176. {
  177. }
  178.  
  179. void DSeqAsmDoc::FreeData()
  180. {
  181.     DSeqDoc::FreeData();
  182. }
  183.  
  184.  
  185. // static
  186. Boolean DSeqAsmDoc::IsAutoseqFile(DFile* aFile)
  187. {
  188.     if (aFile && aFile->Exists()) {
  189.         if (fgTestAutoseqFile) return true;
  190.         aFile->OpenFile("r");
  191.         Boolean isautoseq= true;
  192.         short  nline= 0;
  193.         while (!aFile->Eof() && nline<4 && isautoseq) {
  194.             char  buf[256];
  195.             aFile->ReadLine( buf, sizeof(buf)); nline++;
  196.             switch (nline) {
  197.                 case 1: 
  198.                     if (StrNCmp(buf, "filename:", 9) != 0) isautoseq= false;
  199.                     break;
  200.                 case 2: 
  201.                     if (StrNCmp(buf, "native format:", 14) != 0) isautoseq= false;
  202.                     break;
  203.                 case 3: 
  204.                     if (StrNCmp(buf, "strand:", 7) != 0) isautoseq= false;
  205.                     break;
  206.                 case 4: 
  207.                     if (StrNCmp(buf, "total size:", 11) != 0) isautoseq= false;
  208.                     break;
  209.                 }
  210.             }
  211.         aFile->Close();
  212.         return isautoseq;
  213.         }
  214.     else {
  215.         return false;
  216.         }
  217. }
  218.  
  219.  
  220. // static
  221. void DSeqAsmDoc::NewSeqAsmDoc()
  222. {
  223.     DSeqAsmDoc* newdoc= new DSeqAsmDoc( DSeqAsmDoc::kSeqAsmdoc, NULL, (char*)DFileManager::kUntitled);
  224.     newdoc->Open();
  225.     //newdoc->EditSeqs(); //?? make it real obvious to beginners?
  226. }
  227.  
  228. // static
  229. void DSeqAsmDoc::GetSeqAsmGlobals()
  230. {
  231. }
  232.  
  233. // static
  234. void DSeqAsmDoc::SaveSeqAsmGlobals()
  235. {
  236. }
  237.  
  238.  
  239. void DSeqAsmDoc::MakeGlobalsCurrent()
  240. {
  241.     DSeqDoc::MakeGlobalsCurrent();
  242. }
  243.  
  244. void DSeqAsmDoc::Close()
  245. {
  246.     DSeqDoc::Close();
  247. }
  248.  
  249.  
  250. void DSeqAsmDoc::Open(DFile* aFile)
  251. {
  252.     if (DSeqAsmDoc::fgTestAutoseqFile) 
  253.         DSeqDoc::Open(aFile);
  254.     else {
  255.         fAutoseqFilesRead= 0; // always in this case, but don't know when coming from autoseq
  256.  
  257.         short gotTrace= 0;
  258.         Boolean isempty= (fSeqList->GetSize() < 1);
  259.         aFile->fType="autoseq/tfs";  
  260.         
  261.         //DSeqDoc::Open(aFile);
  262.         if ( !ReadFrom( aFile, true) ) {
  263.                 if (isempty) this->suicide();
  264.                 return;
  265.                 }
  266.  
  267.         // user selected autoseq.tfs file .. now look for .A, .C, .. files
  268.         char *fname, buf[512];
  269.         StrNCpy( buf, aFile->GetName(), sizeof(buf));
  270.         DFileManager::ReplaceSuffix( buf, sizeof(buf), ".A");
  271.         DFile bFile( buf);
  272.         if (bFile.Exists()) {
  273.             bFile.fType= "autoseq/atrace";  
  274.             //DSeqDoc::Open(&bFile);
  275.             if ( ReadFrom( &bFile, true) ) gotTrace++;
  276.             }
  277.         
  278.         DFileManager::ReplaceSuffix( buf, sizeof(buf), ".C");
  279.         bFile.SetName( buf);
  280.         if (bFile.Exists()) {
  281.             bFile.fType= "autoseq/ctrace";  
  282.             //DSeqDoc::Open(&bFile);
  283.             if ( ReadFrom( &bFile, true) ) gotTrace++;
  284.             }
  285.  
  286.         DFileManager::ReplaceSuffix( buf, sizeof(buf), ".G");
  287.         bFile.SetName( buf);
  288.         if (bFile.Exists()) {
  289.             bFile.fType= "autoseq/gtrace";  
  290.             //DSeqDoc::Open(&bFile);
  291.             if ( ReadFrom( &bFile, true) ) gotTrace++;
  292.             }
  293.  
  294.         DFileManager::ReplaceSuffix( buf, sizeof(buf), ".T");
  295.         bFile.SetName( buf);
  296.         if (bFile.Exists()) {
  297.             bFile.fType= "autoseq/ttrace";  
  298.             //DSeqDoc::Open(&bFile);
  299.             if ( ReadFrom( &bFile, true) ) gotTrace++;
  300.             }
  301.  
  302.         if (gotTrace) {
  303.             if (isempty) {
  304.                 this->SetTitle((char*)aFile->GetShortname());
  305.                 this->SetFilename((char*)aFile->GetName());
  306.                 }
  307.             this->Open();
  308.             }
  309.         else if (isempty) this->suicide();
  310.         } 
  311. }
  312.  
  313.  
  314. void DSeqAsmDoc::Revert()
  315. {
  316.     DSeqDoc::Revert();
  317. }
  318.  
  319. void DSeqAsmDoc::AddAlnIndex(DView* super, short width, short height)
  320. {
  321.     fAlnIndex= new DAlnIndex(0, super, this, fSeqList, width, height); 
  322. }
  323.  
  324. void DSeqAsmDoc::AddAlnView(DView* super, short width, short height)
  325. {
  326.     if (fHaveAsmseq)
  327.         fAlnView= new DAsmView(0, super, this, fSeqList, width, height); 
  328.     else
  329.         fAlnView= new DAlnView(0, super, this, fSeqList, width, height); 
  330. }
  331.  
  332. void DSeqAsmDoc::AddModePopup(DView* super)
  333. {
  334.     fModePop= new DAsmModePopup(kModeAsmPopup, super);
  335. }
  336.  
  337.  
  338. void DSeqAsmDoc::AddTopViews(DView* super)
  339. {
  340.     DPrompt* pr;
  341.  
  342.     pr= new DPrompt(0,super,"Color:",0, 0, Nlm_programFont);
  343.     super->NextSubviewToRight();
  344.     fColorPop= new DAsmColorPopup(kColorPopup,super,fgUseColor); //kColorAsmPopup
  345.     fUseColor= fgUseColor; // not used??
  346.     super->NextSubviewToRight();
  347.  
  348.     pr= new DPrompt(0,super," View:",0, 0, Nlm_programFont);
  349.     super->NextSubviewToRight();
  350.     this->AddModePopup(super); 
  351.     fLockCheck= NULL;
  352.  
  353.     super->NextSubviewToRight();
  354.     pr= new DPrompt(0,super,"  File format:",0, 0, Nlm_programFont);
  355.  
  356.     DCluster* metergrp= new DCluster( 0, this, 0, 0, true);   // was 0,0 for w,h
  357.     pr= new DPrompt(0,metergrp,"Point#",0, 0, Nlm_programFont);
  358.     metergrp->NextSubviewToRight();
  359.     fSeqMeter= new DPrompt(0,metergrp,"0000000",0,0,Nlm_programFont,justright); //60,14
  360.  
  361.     super->NextSubviewToRight();
  362.     fFormatPop= new DSeqFormatPopup1(0,super,fInFormat);
  363.     
  364.     super->NextSubviewBelowLeft();
  365. }
  366.  
  367.  
  368. void DSeqAsmDoc::AddViews()
  369. {
  370.     Boolean needviews= (!fAlnView || !fAlnIndex || !fAlnHIndex || !fAlnITitle);
  371.     if (needviews) {
  372.         new DPrompt(0,this,"  * PRELIMINARY Sequence Assembly *  ",0, 0, Nlm_systemFont);
  373.  
  374.         if (fHaveAsmseq) {
  375.             DView* super= this;
  376.             super->NextSubviewToRight();
  377.             DCheckBox* ck= new DCheckBox(kBaseOnTrace,super, "");
  378.             ck->SetStatus(true); // default behavior, no sticky pref yet
  379.             super->NextSubviewToRight();
  380.             (void) new DPrompt(0, super, "Bases on trace",0, 0, Nlm_programFont);
  381.             }
  382.         this->NextSubviewBelowLeft();
  383.         }
  384.         
  385.     DSeqDoc::AddViews();
  386. }
  387.  
  388.  
  389. void DSeqAsmDoc::Open()
  390. {
  391. #if 0    
  392.     DSeqDoc::Open();
  393. #else
  394.     Boolean selectone= false;
  395.     if (!fSeqList) fSeqList= new DSeqList();
  396.     if (fSeqList->GetSize() == 0) {
  397.         fSeqList->AddNewSeq();    // install 1 blank seq for new doc
  398.         selectone= true;
  399.         }
  400.     
  401.     AddViews();
  402.     fSaveHandler= this;  
  403.     fPrintHandler= this; 
  404.  
  405.     this->Select(); // for motif
  406.     this->CalcWindowSize();
  407.     fAlnView->GetReadyToShow(); // do before others ...
  408.     if (fAlnIndex) fAlnIndex->GetReadyToShow();
  409.     fAlnITitle->GetReadyToShow();
  410.  
  411.     fAlnView->SetViewColor(fgUseColor);
  412.     fAlnView->SetViewMode(fgViewMode);
  413.     if (selectone && fAlnIndex) fAlnIndex->SelectCells(0,0);
  414.     fSeqMeter->Show();  
  415.     
  416.     DWindow::Open();
  417. #endif
  418. }
  419.  
  420.  
  421. void DSeqAsmDoc::Activate()
  422. {
  423.     DSeqDoc::Activate();
  424. }
  425.  
  426. void DSeqAsmDoc::Deactivate()
  427. {
  428.     DSeqDoc::Deactivate();
  429. }
  430.  
  431. void DSeqAsmDoc::Print()
  432. {
  433.     DSeqDoc::Print();
  434. }
  435.  
  436. Boolean DSeqAsmDoc::IsMyTask(DTask* theTask) 
  437. {
  438.     return DSeqDoc::IsMyTask(theTask);
  439. }
  440.  
  441. void DSeqAsmDoc::ProcessTask(DTask* theTask) 
  442. {
  443.     if (theTask->fNumber == -87654) {
  444.  
  445.         }
  446.     else {
  447.         DSeqDoc::ProcessTask(theTask);
  448.         }
  449. }
  450.  
  451.  
  452. void DSeqAsmDoc::SortView(DSeqList::Sorts sortorder)
  453. {
  454.     //DSeqDoc::SortView(sortorder);
  455. }
  456.  
  457.  
  458. void DSeqAsmDoc::AddSeqToList(DSequence* item)
  459. {
  460.     DSeqDoc::AddSeqToList(item);
  461. }    
  462.  
  463.  
  464.  
  465. void DSeqAsmDoc::AddNewSeqToList()
  466. {
  467.     DSeqDoc::AddNewSeqToList();
  468. }
  469.  
  470.   
  471. void DSeqAsmDoc::GetSelection( long selectFlags, DSeqList*& aSeqList, 
  472.                             long& start, long& nbases)
  473. {
  474.     DSeqDoc::GetSelection( selectFlags, aSeqList, start, nbases);
  475. }
  476.             
  477.  
  478. short DSeqAsmDoc::SelectionToFile(Boolean AllatNoSelection, char* aFileName, 
  479.             short seqFormat)  
  480. {
  481.     return DSeqDoc::SelectionToFile( AllatNoSelection, aFileName, seqFormat);
  482. }
  483.  
  484.  
  485. void DSeqAsmDoc::WriteTo(DFile* aFile)  
  486. {
  487. #if 0
  488.     DSeqDoc::WriteTo( aFile);
  489. #else    
  490.     long i, n = fSeqList->GetSize();
  491.     for (i=0; i<n; i++) {
  492.         char * name, newname[512], backname[512];
  493.         fAsmSeq= (DAsmSequence*) fSeqList->SeqAt(i);
  494.         Boolean dotrace= fAsmSeq->ShowTrace() && (fAsmSeq->Kind() == DAsmSequence::kAutoseq);
  495.         if (!dotrace)  
  496.             ; //DSeqDoc::WriteTo( aFile); << not for single sequences...
  497.         else {
  498.             fAsmSeq->TraceToBases();
  499.             name = (char*)fAsmSeq->TracefileName();
  500.             //if (!name) name= "myseq.tfs";
  501.             DFile fromFile(name);
  502.             if (i>0) {
  503.                 sprintf( newname, "%s.new", name);
  504.                 sprintf(backname, "%s.old", name);
  505.                 aFile= new DFile(newname);
  506.                 }
  507.             ReadTraceStats( &fromFile, true, aFile);  
  508.             if (i>0) {
  509.                 DFileManager::Rename( name, backname);
  510.                 DFileManager::Rename( newname, name);
  511.                 }
  512.             }
  513.         }
  514.     this->NotDirty();  
  515. #endif
  516. }
  517.  
  518.  
  519.  
  520.  
  521. void DSeqAsmDoc::ReadTrace(DFile* aFile, short tracenum)     
  522. {
  523.     char   * cp, buf[512];
  524.     TraceBase  tb, * tbuf = NULL;  
  525.     long   np= 0, maxp = 0;
  526.     Boolean traceokay;
  527.     short ht, maxht = 0;
  528.     
  529.     aFile->Open("r"); fAutoseqFilesRead++;
  530.     tbuf= fAsmSeq->Trace();
  531.     np= 0; // NO: fAsmSeq->NumPoints();  
  532.     maxp= fAsmSeq->MaxPoints();
  533.     traceokay= (tracenum>=TraceBase::tA && tracenum<=TraceBase::tT); 
  534.     while (!aFile->Eof()) {
  535.         aFile->ReadLine( buf, sizeof(buf));
  536.         cp= buf; 
  537.         ht= atoi(cp); maxht= Max( maxht, ht);
  538.         
  539.         if (np >= maxp) {    
  540.             if (fNtrace && !maxp)maxp= fNtrace+1;// read maxp from ReadTraceStats()
  541.             else maxp += 1000;
  542. #if 1
  543.             fAsmSeq->UpdateTrace( tbuf, np, maxp);
  544. #else
  545.             TraceBase* tmpb= new TraceBase[ maxp];
  546.             if (tbuf) {
  547.                 MemCpy( tmpb, tbuf, np * sizeof(TraceBase));
  548.                 delete tbuf;
  549.                 }
  550.             //fAsmSeq->FreeTrace();
  551.             tbuf= tmpb;
  552. #endif
  553.             if (!tbuf) traceokay= false;
  554.             }
  555.         if (traceokay) {
  556.             tb= tbuf[np];
  557.             tb.tr[tracenum]= ht;
  558.             tbuf[np++]= tb;
  559.             }
  560.         }
  561.         
  562.     if (tbuf && maxp) {
  563. #if 1
  564.         fAsmSeq->UpdateTrace( tbuf, np, maxp); 
  565. #else
  566.         fAsmSeq->SetTrace( tbuf, np, maxp, false); 
  567. #endif
  568.         fAsmSeq->SetMaxHeight( tracenum, maxht);
  569.         }
  570. }
  571.  
  572.          
  573. void DSeqAsmDoc::ReadTraceStats(DFile* aFile, Boolean rewrite, DFile* toFile)     
  574. {
  575. #if 0
  576. // autoseq/tfs format
  577. // various doc and values at top...
  578. total size:    5079
  579. window:        [0,5078]  (5079 points)
  580. min/max/mean:    0/255/29  (within window)
  581. sequence len:    454
  582. ///
  583. peaks picked:    495
  584. //#    X    ht    ctr    left   right  width      P(H) P(D|NULL)    P(D|H)    P(H|D)
  585. 1    G    42      0     0.0     2.6    2.6  1.00e+00  1.97e-03  8.92e-01  9.98e-01
  586. 2    T    39      0     0.0     4.3    4.3  1.00e+00  6.58e-05  3.67e+04  1.00e+00
  587. 3    A    66     15     8.6    18.7   10.1  1.00e+00  1.41e-04  2.13e+02  1.00e+00
  588. 4    G   128     15    10.4    21.0   10.6  1.00e+00  7.01e-12  1.84e+16  1.00e+00
  589. 5    T    26     17    12.2    22.0    9.8  1.00e+00  2.20e-03  2.72e+01  1.00e+00
  590. 6    C    36     25    19.9    37.0   17.1  1.00e+00  5.36e-03  1.53e-01  9.66e-01
  591. 7    G    44     28    21.0    31.8   10.8  1.00e+00  1.57e-03  1.41e+00  9.99e-01
  592. 8    T    37     28    22.0    33.8   11.8  1.00e+00  1.24e-04  1.02e+04  1.00e+00
  593. 9    A    80     32    28.1    35.6    7.6  1.00e+00  1.42e-05  1.99e+04  1.00e+00
  594. 10   C    24     52    48.6    55.8    7.2  1.00e+00  1.01e-02  3.84e-02  7.92e-01
  595. ... to 495
  596. #endif
  597.  
  598.     char  base, buf[512], buf2[128];
  599.     int        num, ht, ctr, npeaks = 0, npoints = 0; // int for sscanf(%d)
  600.     float        left, right, width;
  601.     float        ph, pd, phd, pdh;
  602.     Boolean    incolumns = false, gotpeaks = false;
  603.     char    * bseq = NULL;
  604.     short    * cseq = NULL;
  605.     TraceBase * tbuf = NULL;
  606.     long        atpt, num1, ns= 0, maxs= 0;
  607.     
  608.     aFile->Open("r"); 
  609.     fAutoseqFilesRead++;
  610.     if (rewrite) {
  611.         if (!toFile) return;
  612.         toFile->Open("w");
  613.         atpt= num1 = 0;
  614.         tbuf= fAsmSeq->Trace();
  615.         }
  616.         
  617.     while (!aFile->Eof()) {
  618.         MemSet( buf, 0, sizeof(buf));
  619.         aFile->ReadLine( buf, sizeof(buf));
  620.         if (*buf < ' ') ;
  621.         else if (incolumns) {
  622.             const char* scanform  = "%d %c %d %d %f %f %f %e %e %e %e";
  623.             const char* printform = 
  624.                 "%-4d %c %5d %6d %7.1f %7.1f %6.1f %10.2e %10.2e %10.2e %10.2e\n";
  625.             num= ht= ctr= 0;
  626.             //MemSet( buf2, 0, sizeof(buf2));
  627.             sscanf( buf, scanform,
  628.                          &num, &base, &ht, &ctr, &left, &right, &width, &ph, &pd, &pdh, &phd);
  629.             // num should be in [1..npeaks]
  630.     
  631.             if (rewrite) {
  632.                 num1++; // need to replace num w/ num1 in buf !
  633.                 sprintf( buf, printform,
  634.                                   num1, base, ht, ctr, left, right, width, ph, pd, pdh, phd);
  635.                 toFile->WriteLine( buf);
  636.                 *buf= 0;
  637.                                   
  638.                         // added points
  639.                 while (atpt < ctr) {
  640.                     TraceBase tr= tbuf[atpt];
  641.                     if (tr.base) {
  642.                         long  ht = 0;
  643.                         //char *rest= " 1.0       0.0       0.0       0.0     ";
  644.                         switch (tr.base) {
  645.                             case 'A': ht= tr.tr[0]; break;
  646.                             case 'C': ht= tr.tr[1]; break;
  647.                             case 'G': ht= tr.tr[2]; break;
  648.                             case 'T': ht= tr.tr[3]; break;
  649.                             }
  650.                         num1++;
  651.                         MemSet( buf2, 0, sizeof(buf2));
  652.                         sprintf( buf2, printform,
  653.                                      num1, tr.base, ht, atpt, 
  654.                                      (float)atpt-1, (float)atpt+1, 3.0, 1.0, 0.0, 0.0, 1.0);
  655.                         toFile->WriteLine( buf2);
  656.                         }
  657.                     atpt++;
  658.                     }
  659.                         // deleted points -- tbuf[ctr].base == null !!
  660.                 if (atpt > ctr) {
  661.                         // !? what of extra old points we had to shift up?
  662.                     ctr= atpt; //??
  663.                     }
  664.  
  665.                 if (!tbuf[ctr].base) *buf= 0;
  666.                 else atpt++; //??
  667.                 }
  668.             else {
  669.                 if (ns >= maxs) {
  670.                     if (maxs == 0) maxs = 1+npeaks;
  671.                     else maxs += 1000;
  672.                     if (bseq) bseq= (char*) MemMore(bseq, maxs * sizeof(char));
  673.                     else bseq= (char*) MemNew( maxs * sizeof(char));
  674.                     if (cseq) cseq= (short*) MemMore(cseq, maxs * sizeof(short));
  675.                     else cseq= (short*) MemNew( maxs * sizeof(short));
  676.                     }
  677.                 bseq[ns]= base;
  678.                 cseq[ns]= ctr;
  679.                 }
  680.             ns++;
  681.             if (ns >= npeaks) incolumns= false; // !?
  682.             }
  683.         else if (gotpeaks) {
  684.             if (*buf == '#') incolumns= true;
  685.             }
  686.         else if (StrNICmp(buf,"peaks picked:",13) == 0) {
  687.             sscanf( buf, "peaks picked: %d", &npeaks);
  688.             gotpeaks= true;
  689.             if (rewrite) sprintf( buf, "peaks picked: %d\n", fAsmSeq->LengthF());
  690.             }    
  691.         else if (StrNICmp(buf,"total size:",11) == 0) {
  692.             npoints= 0;
  693.             sscanf( buf, "total size: %d", &npoints);
  694.             fNtrace= npoints;
  695.             }    
  696.             
  697.         if (rewrite && *buf) toFile->WriteLine( buf);
  698.         }
  699.         
  700.     if (rewrite) toFile->Close();
  701.     else if (ns && bseq && cseq) {
  702.         bseq[ns]= 0;
  703.         cseq[ns]= 0;
  704.         fAsmSeq->SetBases( bseq, false); 
  705.         fAsmSeq->SetTrCenter( cseq, ns, false);  // don't need now??
  706.         fAsmSeq->SetPoints( npoints);
  707.         fAsmSeq->SetTracefileName( (char*)aFile->GetName());
  708.         fAsmSeq->SetName( (char*)aFile->GetShortname());
  709.         }
  710. }
  711.  
  712.  
  713.  
  714. Boolean DSeqAsmDoc::ReadFrom(DFile* aFile, Boolean append)    // revise for iostreams
  715. {
  716.     if (!append) FreeData();   
  717.     gDefSeqName= this->GetTitle(gDefSeqNameStore,sizeof(gDefSeqNameStore));
  718.     if (!fSeqList) fSeqList= new DSeqList();
  719.     if (!fAsmSeq) {
  720.         fAsmSeq= new DAsmSequence();
  721.         fSeqList->InsertLast( fAsmSeq);
  722.         }
  723.  
  724.     char* ft= aFile->fType; // fType holds autoseq/type string !?
  725.     if (StrICmp(ft, "autoseq/pseq")==0)  
  726.         ; // fInFormat= DSeqFile::ReadSeqFile(aFile, fSeqList);   << don't need
  727.     else if (StrICmp(ft, "autoseq/tfs")==0)     ReadTraceStats( aFile);  
  728.     else if (StrICmp(ft, "autoseq/atrace")==0)    ReadTrace( aFile, TraceBase::tA);
  729.     else if (StrICmp(ft, "autoseq/ctrace")==0)     ReadTrace( aFile, TraceBase::tC);
  730.     else if (StrICmp(ft, "autoseq/gtrace")==0)    ReadTrace( aFile, TraceBase::tG);
  731.     else if (StrICmp(ft, "autoseq/ttrace")==0)    ReadTrace( aFile, TraceBase::tT);
  732.     else return false;
  733.     
  734.     fHaveAsmseq= true;
  735.     // can we remove this mem leak now?
  736.     // NO: This is too risky -- caller should solve the leak
  737.     // MemFree(aFile->fType); aFile->fType=NULL;
  738.  
  739.     if (fAutoseqFilesRead >= 5) {
  740.         // got all files for fAsmSeq, reset for next autoseq set...
  741.         // set fAsmSeq->Trace().base using TrCenter
  742.         TraceBase * tr = fAsmSeq->Trace();
  743.         short * trc = fAsmSeq->TrCenter();
  744.         long ntr= fAsmSeq->NumPoints();
  745.         for (long i=0; i<fAsmSeq->LengthF(); i++) {
  746.             short ctr= trc[i];
  747.             if (ctr>=0 && ctr<ntr) {
  748.                 while (tr[ctr].base > ' ' && ctr<ntr) ctr++; // can't overlap bases !
  749.                 tr[ctr].base= fAsmSeq->Bases()[i];
  750.                 }
  751.             }
  752.         fAsmSeq= NULL; 
  753.         fAutoseqFilesRead= 0;
  754.         }    
  755.         
  756.     return true;  
  757. }
  758.  
  759.  
  760. void DSeqAsmDoc::OpenSeqedWindow(DSequence* aSeq)
  761. {
  762.     // disallow this, for now... trashes DAsmSequence
  763. }
  764.  
  765.  
  766. void DSeqAsmDoc::MakeSeqPrint(Boolean doREMap)
  767. {
  768.     DSeqDoc::MakeSeqPrint( doREMap);
  769. }
  770.  
  771.  
  772. // static
  773. void DSeqAsmDoc::SetUpMenu(short menuId, DMenu*& aMenu) 
  774. {
  775.     // all done in DSeqDoc::SeqUpMenu() ??
  776. }
  777.  
  778.  
  779. Boolean DSeqAsmDoc::DoMenuTask(long tasknum, DTask* theTask)
  780. {
  781.     return DSeqDoc::DoMenuTask( tasknum, theTask);
  782. }
  783.  
  784.  
  785. Boolean DSeqAsmDoc::IsMyAction(DTaskMaster* action) 
  786. {
  787.     long  menuid= 0, menuitem = action->Id();
  788.  
  789.     if (menuitem == kModeAsmPopup) {
  790.         short mode= fModePop->GetValue();  
  791.         fAlnView->SetViewMode( mode);
  792.       return true;
  793.       }
  794.     else if (fHaveAsmseq && menuitem == kBaseOnTrace) {
  795.         ((DAsmView*)fAlnView)->fBaseOnTrace= ((DView*)action)->GetStatus();
  796.         ((DAsmView*)fAlnView)->Invalidate();
  797.       return true;
  798.         }
  799.         
  800. #ifdef POPBASECALL
  801.     else if (menuitem == kBaseCallPopup) {
  802.         return ((DAsmView*)fAlnView)->fBaseCallPop->IsMyAction( action);
  803.         }
  804. #endif
  805.  
  806. #if 0
  807.     else if (menuitem == kColorAsmPopup) {
  808.         fgUseColor= fColorPop->GetValue();
  809.         fAlnView->SetViewColor( fgUseColor);
  810.       return true;
  811.         }
  812. #endif
  813.     else
  814.         return DSeqDoc::IsMyAction( action);
  815. }
  816.             
  817.  
  818.  
  819.  
  820.